#include<iostream>
#include<string>
#include<functional>
#include<vector>
#include<unistd.h>
#include<stdlib.h>
#include<signal.h>
#include<sys/wait.h>

// int main()
// {
//     if(fork() == 0)
//     {
//         //子进程
//         sleep(1);
//         int a = 10;
//         a /= 0;
//         exit(0);
//     }
//     int status = 0;
//     waitpid(-1, &status, 0);

//     printf("exit signal: %d, core dump: %d\n",status&0x7F,(status>>7)&1);
//     return 0;
// }

void PrintPending(const sigset_t &pending)
{
    std::cout << "curr pending list [" << getpid() << "]: " ;
    for(int signo = 32; signo > 0; signo--)
    {
        if(sigismember(&pending, signo))
        {
            std::cout << 1;
        }
        else
        {
            std::cout << 0;
        }
    }
    std::cout << std::endl;
}
void non_handler(int signo)
{
    std::cout << "处理:" << signo << std::endl;
}

int main()
{
    ::signal(2, SIG_IGN);
    //栈上开辟空间
    sigset_t block, oblock;
    sigemptyset(&block);
    sigemptyset(&oblock);
    //添加2号信号
    //我们没有把对2号信号的屏蔽,设置进入内核中,只是在用户栈上设置了block的位图结构
    sigaddset(&block, 2);
    sigprocmask(SIG_SETMASK,&block,&oblock);
    //设置进入内核
    int cnt = 0;
    while(true)
    {
        //2.如何获取pending表呢?
        sigset_t pending;
        sigpending(&pending);

        //2.1打印
        PrintPending(pending);
        sleep(1);
        cnt++;
        if(cnt == 10)
        {
            std::cout << "解除对2号信号的屏蔽" << std::endl;
            sigprocmask(SIG_SETMASK,&oblock,nullptr);
        }
    }
    return 0;
}


